#!/bin/bash

# 检查是否提供了别名参数
if [ $# -eq 0 ]; then
    echo "错误：请提供别名作为参数"
    exit 1
fi

# 设置参数
ALIASES=$(echo $1 | tr ',' ' ')  # 将逗号分隔的别名转换为空格分隔
JSON_FILE="keystore_params.json"  # 输出参数JSON文件名
PASSWORD="123456"  # 密钥库密码
DN="CN=hncj, OU=hncj, O=hncj, L=changsha, ST=hunan, C=86"  # 证书主题
LOG_FILE="cert_generation.log"  # 日志文件名

# 初始化日志文件
echo "证书生成日志 - $(date)" > "$LOG_FILE"

# 检查并清理旧文件
if [ -f "$JSON_FILE" ]; then
    echo "检测到已有JSON文件存在，将重新生成..." | tee -a "$LOG_FILE"
    rm -f "$JSON_FILE"
fi

# 初始化JSON数组
echo "[" > "$JSON_FILE"

# 用于检测重复别名的数组
declare -A seen_aliases
first=true
processed_aliases=()

for ALIAS in $ALIASES; do
    # 检查是否重复
    if [[ -n "${seen_aliases[$ALIAS]}" ]]; then
        echo "警告：检测到重复别名 '$ALIAS'，将跳过此别名" | tee -a "$LOG_FILE"
        continue
    fi
    seen_aliases[$ALIAS]=1
    processed_aliases+=("$ALIAS")

    JKS_FILE="${ALIAS}.jks"  # 生成的JKS密钥库文件名
    PEM_FILE="${ALIAS}.pem"  # 生成的PEM证书文件名

    # 检查并清理旧文件
    if [ -f "$JKS_FILE" ] || [ -f "$PEM_FILE" ]; then
        echo "检测到已有文件存在，将重新生成 ${ALIAS} 相关文件..." | tee -a "$LOG_FILE"
        rm -f "$JKS_FILE" "$PEM_FILE"
    fi

    # 1. 生成JKS密钥库文件
    # -alias: 密钥别名
    # -keyalg: 密钥算法(RSA)
    # -keypass: 密钥密码
    # -keystore: 密钥库文件
    # -storepass: 密钥库密码
    # -validity: 有效期(天)
    # -dname: 证书主题
    keytool -genkeypair -alias "$ALIAS" -keyalg RSA -keypass "$PASSWORD" \
        -keystore "$JKS_FILE" -storepass "$PASSWORD" -validity 9999 -dname "$DN"

    # 2. 导出PEM格式证书
    # -export: 导出证书
    # -alias: 密钥别名
    # -keystore: 密钥库文件
    # -file: 输出证书文件
    # -storepass: 密钥库密码
    keytool -export -alias "$ALIAS" -keystore "$JKS_FILE" -file "$PEM_FILE" -storepass "$PASSWORD"

    # 3. 获取MD5指纹(保留原始冒号格式)
    # -md5: 计算MD5指纹
    # -noout: 不输出证书
    # -fingerprint: 显示指纹
    # sed: 仅移除前缀保留冒号
    MD5=$(openssl x509 -md5 -in "$PEM_FILE" -noout -fingerprint | sed 's/^.*=//')

    # 4. 获取SHA1指纹(保留原始冒号格式)
    # -sha1: 计算SHA1指纹
    # -noout: 不输出证书
    # -fingerprint: 显示指纹
    # sed: 仅移除前缀保留冒号
    SHA1=$(openssl x509 -sha1 -in "$PEM_FILE" -noout -fingerprint | sed 's/^.*=//')

    # 5. 获取公钥模数(十六进制格式)
    # -noout: 不输出私钥
    # -text: 以文本形式输出
    # awk: 提取modulus部分
    # tr: 移除空格和换行
    PUBLIC_KEY=$(openssl rsa -in "$JKS_FILE" -noout -text -passin pass:"$PASSWORD" 2>/dev/null |
                 awk '/modulus:/{flag=1; next} /^[^ ]/{flag=0} flag' | tr -d '\n' | tr -d ' ')

    # 添加JSON对象(如果不是第一个元素则添加逗号)
    if [ "$first" = false ]; then
        echo "," >> "$JSON_FILE"
    fi
    first=false

    # 生成JSON对象(使用printf避免警告)
    printf '  {
    "alias": "%s",
    "keystorePath": "%s/%s",
    "pemPath": "%s/%s",
    "md5": "%s",
    "sha1": "%s",
    "publicKey": "%s"
  }' "$ALIAS" "$(pwd)" "$JKS_FILE" "$(pwd)" "$PEM_FILE" "$MD5" "$SHA1" "$PUBLIC_KEY" >> "$JSON_FILE"
done

# 结束JSON数组
echo -e "\n]" >> "$JSON_FILE"

# 记录处理结果
echo "已处理别名: ${processed_aliases[*]}" | tee -a "$LOG_FILE"
echo "已生成 $JSON_FILE 文件" | tee -a "$LOG_FILE"
